package tp1.arbolBmas.principal;

import java.util.ArrayList;
import java.util.List;

import Utils.StringUtil;

import com.sun.xml.internal.ws.util.StringUtils;

import tp1.arbolBmas.ArbolBmas;
import tp1.arbolBmas.nodo.Clave;
import tp1.arbolBmas.nodo.Hoja;
import tp1.arbolBmas.nodo.Nodo;
import tp1.arbolBmas.nodo.NodoConHijos;
import tp1.arbolBmas.nodo.NodoIntermedio;
import tp1.arbolBmas.nodo.Raiz;
import tp1.arbolBmas.nodo.Tipo;
import tp1.arbolBmas.nodo.dato.Dato;

public class Principal 
{
	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		/*
		ArbolBmas arbol = new ArbolBmas();
		
		arbol.agregar( new Raiz(new Clave("a100"), new Dato("a100"), null, null ) );
		
		Nodo intermedioIzq  = new NodoIntermedio( new Tipo(Tipo.HIJO_IZQUIERDO) , new Clave("a50") , new Dato("a50") ,null,null, null);
		Nodo intermedioDer  = new NodoIntermedio( new Tipo(Tipo.HIJO_DERECHO) , new Clave("a180") , new Dato("a180") ,null,null, null);

		arbol.agregar(intermedioIzq);
		arbol.agregar(intermedioDer);
		
		Nodo e = new Hoja( new Tipo(Tipo.HIJO_IZQUIERDO) , new Clave("a7") , new Dato("a7") , null);
		Nodo f = new Hoja( new Tipo(Tipo.HIJO_DERECHO) , new Clave("a51") , new Dato("a51") , null);
		Nodo g = new Hoja( new Tipo(Tipo.HIJO_IZQUIERDO) , new Clave("a165") , new Dato("a165") , null);
		Nodo h = new Hoja( new Tipo(Tipo.HIJO_DERECHO) , new Clave("a400") , new Dato("a400") , null);
			
		arbol.agregar(e);
		arbol.agregar(f);
		arbol.agregar(g);
		arbol.agregar(h);
		*/
		//imprimirPorConsola(arbol);
		
		/*
		Nodo hoja2 = new Hoja(new Tipo(Tipo.HIJO_DERECHO), new Clave("s"),new Dato("unDatoHoja_2") );
		arbol.agregar(hoja2);
		System.out.println("arbol: " + arbol );
		*/
		
	}
	
	private static void imprimirPorConsola(ArbolBmas arbol) 
	{
		List<Nodo> nodosAimprimir = new ArrayList<Nodo>(100);
		
		nodosAimprimir.add(arbol.getRaiz());
		
		imprimirRecursivo( nodosAimprimir , 0 );
	}

	private static void imprimirRecursivo(List<Nodo> nodosAimprimir,int nivel) 
	{
		if(nodosAimprimir.size() == 0) // CASO BASE
		{
			System.out.println("\n **** FIN DEL ARBOL ****");
			return;
		}
		else
		{
			Nodo actual = nodosAimprimir.get(0);
					
			//Quito y proceso el primero
			//nodosAimprimir.remove(0);
			if(actual == null )
			{
				System.out.println( tabular( nivel ) + "NULL" ) ;
			}
			if(actual instanceof Hoja )
			{
				System.out.print( tabular( nivel ) + (Hoja)actual ) ;
				nodosAimprimir.remove(0);
				imprimirRecursivo(nodosAimprimir, nivel);	
			}
			else
			{
				List<Nodo> nuevosNodosAimprimir = new ArrayList<Nodo>( nodosAimprimir.size() * 2 ); // Todos los hijos del parametro
				
				for (Nodo nodo : nodosAimprimir) 
				{
					System.out.println( (NodoConHijos) nodo );
					//si no es una hoja -----> tiene hijo (y es completo)
					nuevosNodosAimprimir.add( ((NodoConHijos) nodo).getHijoIzquierdo() );
					nuevosNodosAimprimir.add( ((NodoConHijos) nodo).getHijoDerecho() );
				}
				
				//Recursion
				imprimirRecursivo(nuevosNodosAimprimir, nivel++);
			}
		}
	}

	private static String tabular(int nivel) 
	{
		StringBuilder sb = new StringBuilder();
		for(int i=0; i < nivel; i++)
		{
			sb.append("       ");
		}
		
		return sb.toString();
	}

}

